package com.example.demo.test.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.persistence.*;
import java.util.Date;


/**
 * @Entity 对实体注释。任何Hibernate映射对象都要有这个注释
 * @Table 声明此对象映射到数据库的数据表，通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的，如果没有则系统使用默认值(实体的短类名)。
 * @Version 该注释可用于在实体Bean中添加乐观锁支持。
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
@Entity
@Table(name = "news")
@NamedQueries({
        @NamedQuery(name = "News.findById", query = "select n from News as n where n.id = ?1"),
        @NamedQuery(name = "News.findAllNews", query = "select n from News as n")
})
public class News {

    /**
     * @Id 声明此属性为主键。该属性值可以通过应该自身创建，但是Hibernate推荐通过Hibernate生成
     * @GeneratedValue 指定主键的生成策略。有如下四个值
     * TABLE：使用表保存id值
     * IDENTITY：identitycolumn
     * SEQUENCR ：sequence
     * AUTO：根据数据库的不同使用上面三个
     * <p>
     * 声明普通属性：
     * @Column 声明该属性与数据库字段的映射关系。
     * <p>
     * 注意：
     * 1、当POJO有属性不需要映射的时候一定要用@Transitent修饰，
     * 该注释表示此属性与表没有映射关系，只是一个暂时的属性。
     * 2、@Lob注释表示该属性持久化为Blob或者Clob类型，具体取决于属性的类型。
     * <p>
     * 声明关联关系：
     * 一对多关联关系：
     * @OneToMany(mappedBy=” person”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
     * 一对多声明：
     * @ManyToOne(cascade=CascadeType.REFRESH,)
     * @JoinColumn 多对一声明 ,声明为双向关联
     * <p>
     * 一对一关联关系：
     * @OneToOne(optional= true, cascade =CascadeType.ALL, mappedBy = “person”)
     * 一对一关联声明：
     * @OneToOne(optional = false, cascade = CascadeType.REFRESH)
     * @JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
     * 声明为双向关联
     * <p>
     * 多对多关联关系：
     * @ManyToMany(mappedBy= “students”)
     * 多对多关联声明。
     * @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
     * @JoinTable(name = “Teacher_Student”,
     * joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName =“teacherid”)},
     * inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =“studentid”)})
     */

    /**
     * @GeneratedValue 讲解
     * @GeneratedValue 注解存在的意义主要就是为一个实体生成一个唯一标识的主键、@GeneratedValue提供了主键的生成策略
     * @GeneratedValue 注解有两个属性,分别是strategy和generator
     * generator属性 generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)
     * strategy属性
     * -AUTO主键由程序控制, 是默认选项
     * -IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持
     * -SEQUENCE 通过数据库的序列产生主键, MYSQL不支持
     * -Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
     */
    @Id
    @Column(name = "news_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "news_name")
    private String title;

    @Column(name = "news_author")
    private String author;

    @Column(name = "news_date")
    private Date date;


}
